IB/FB SP nevraci vysledek?

Otázka od: Jaroslav Uher

8. 9. 2002 3:44

Ahoj,

D6P, Win2000, FB 1
mam SP, ktera hromadne updatuje hodnotu jednoho pole

SET TERM !! ;

/* procedura zmeni hodnotu DEL 'posle do archivu' nebo
    'z archivu' vsechny pripady
    N/P starsi nez zadane datum
    a vrati pocet takto 'presunutych'
*/
    
CREATE PROCEDURE PRIPADY_TO_ARCHIV (
   U_NP SMALLINT,
   U_DT_VZNIKU DATE,
   U_DEL SMALLINT,
   U_NEWDEL SMALLINT,
   U_LAST_USER CHAR(4))
RETURNS (POCET INTEGER)
AS
DECLARE VARIABLE S_ID INTEGER;
BEGIN
  POCET = 0;
  BEGIN
    FOR SELECT ID FROM PRIPADY
    WHERE (NP = :U_NP) AND (DEL = :U_DEL) AND (DT_VZNIKU < :U_DT_VZNIKU)
    INTO :S_ID
    DO
    BEGIN
      UPDATE PRIPADY
     SET DEL = :U_NEWDEL, LAST_USER = :U_LAST_USER,
LAST_UPDATE = 'NOW'
     WHERE ID = :S_ID;
    END
   POCET = POCET +1;
    SUSPEND;
  END
END !!
SET TERM ; !!

COMMIT;

zda se, ze vse funguje OK, ale nejak mi (asi) nevraci POCET nebo jej nedokazu
odchytit.
Na klientovi je toto:

...
with IBStoredProc.Params.CreateParam(ftString, 'LAST_USER',ptInput) do
  AsString := xxx;

 IBStoredProc.Prepare;
 IBStoredProc.ExecProc;

 Pocet := IBStoredProc.Params.CreateParam(ftInteger,
'POCET',ptOutput).AsInteger;
// POCET je porad 0, i kdyz update se provede na x zaznamech

 IBTransaction1.CommitRetaining;

 MessageDlg(Format(rsM_NumberPripaduMoved, [Pocet]), mtInformation, [mbYes],0)


Muze mi, prosim nekdo poradit, kde delam chybu ?

Dekuji a preji hezky den,

Jarek Uher

Odpovedá: Jan Sebelík

8. 9. 2002 18:02

Ja teda nevim, ale jsou mi tam divne tri veci:
1.
Ten SUSPEND je tam podle me zbytecny.
Pokud je mi znamo, tak SUSPEND se pouziva tehdy, kdyz ma procedura vracet
tabulku hodnot, na klientovi pak "select * from proc(x,y,z)". Jinak potreba
neni.
2.
Pokud dobre koukam, tak ten POCET=POCET+1 neni uvnitr cyklu FOR SELECT, ale az
za nim.
3.
Jestlize TIBStoredProc priradim jmeno (a asi prepare), tak by si parametry mela
vytvorit sama.
Ja jenom zadam vstupni:
IBStoredProc.Params.ByName(...).asString:=...;
udelam
IBStoredProc.Execute;
a prectu vystupni
....:=IBStoredProc.Params.ByName(...).asInteger;

Pisu to z hlavy, takze je to mozna malinko jinak.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 0434 692 569 (0776 347735)
=========================================
----------
> Odesílatel: Jaroslav Uher <moravia@mbox.vol.cz>
> Komu: delphi-l@clexpert.cz
> Předmět: IB/FB SP nevraci vysledek?
> Datum: 6. září 2002 14:23
>
> Ahoj,
>
> D6P, Win2000, FB 1
> mam SP, ktera hromadne updatuje hodnotu jednoho pole
>
> SET TERM !! ;
>
> /* procedura zmeni hodnotu DEL 'posle do archivu' nebo
> 'z archivu' vsechny pripady
> N/P starsi nez zadane datum
> a vrati pocet takto 'presunutych'
> */
>
> CREATE PROCEDURE PRIPADY_TO_ARCHIV (
> U_NP SMALLINT,
> U_DT_VZNIKU DATE,
> U_DEL SMALLINT,
> U_NEWDEL SMALLINT,
> U_LAST_USER CHAR(4))
> RETURNS (POCET INTEGER)
> AS
> DECLARE VARIABLE S_ID INTEGER;
> BEGIN
> POCET = 0;
> BEGIN
> FOR SELECT ID FROM PRIPADY
> WHERE (NP = :U_NP) AND (DEL = :U_DEL) AND (DT_VZNIKU < :U_DT_VZNIKU)
> INTO :S_ID
> DO
> BEGIN
> UPDATE PRIPADY
> SET DEL = :U_NEWDEL, LAST_USER = :U_LAST_USER,
> LAST_UPDATE = 'NOW'
> WHERE ID = :S_ID;
> END
> POCET = POCET +1;
> SUSPEND;
> END
> END !!
> SET TERM ; !!
>
> COMMIT;
>
> zda se, ze vse funguje OK, ale nejak mi (asi) nevraci POCET nebo jej nedokazu

> odchytit.
> Na klientovi je toto:
>
> ...
> with IBStoredProc.Params.CreateParam(ftString, 'LAST_USER',ptInput) do
> AsString := xxx;
>
> IBStoredProc.Prepare;
> IBStoredProc.ExecProc;
>
> Pocet := IBStoredProc.Params.CreateParam(ftInteger,
'POCET',ptOutput).AsInteger;
> // POCET je porad 0, i kdyz update se provede na x zaznamech
>
> IBTransaction1.CommitRetaining;
>
> MessageDlg(Format(rsM_NumberPripaduMoved, [Pocet]), mtInformation,
[mbYes],0)
>
>
> Muze mi, prosim nekdo poradit, kde delam chybu ?
>
> Dekuji a preji hezky den,
>
> Jarek Uher

Odpovedá: Kalhous Zdenek

9. 9. 2002 9:00

On 6 Sep 2002 at 14:23, Jaroslav Uher wrote:
> IBStoredProc.Prepare;
> IBStoredProc.ExecProc;
> Pocet := IBStoredProc.Params.CreateParam(ftInteger,
> 'POCET',ptOutput).AsInteger;
> // POCET je porad 0, i kdyz update se provede na x zaznamech
Vraceni vysledku procedury do delphi je podivna vec. IBStoredProc
nepouzivam ale kdyz udelate treba pres IBSQL
SELECT POCET from jmeno_procedury
tak tahle procedura vrati radu cisel od 1 do x. Aby delala to co
chcete, je potreba suspend dat az za cykl FOR SELECT. Potom
tento SELECT vrati jediny radek a bude to POCET=x.